其他
优酷鸿蒙开发实践 | 鸿蒙卡片开发
{
...
"formsEnabled": true,
"forms": [
{
"landscapeLayouts": [
"$layout:youku_widget_2_2",
"$layout:youku_widget_2_4"
],
"isDefault": true,
"defaultDimension": "2*2",
"name": "youku_widget",
"description": "$string:yk_widget_description",
"colorMode": "auto",
"type": "Java",
"supportDimensions": [
"2*2",
"2*4"
],
"portraitLayouts": [
"$layout:youku_widget_2_2",
"$layout:youku_widget_2_4"
],
"updateEnabled": true,
"updateDuration": 1
}
],
...
}
/**
* 创建卡片时的回调。
* 在intent中,存有创建卡片的一些重要参数,可以通过Intent.getXXXParam()方法获取。
* AbilitySlice.PARAM_FORM_IDENTITY_KEY: long类型,用于唯一标识一个卡片
* AbilitySlice.PARAM_FORM_NAME_KEY: String类型,卡片名称,即在config.json中定义的name属性
* AbilitySlice.PARAM_FORM_DIMENSION_KEY: int类型,卡片大小标识,
* 取值范围是1-4,分别表示1x2、2x2、2x4、4x4
*/
protected ProviderFormInfo onCreateForm(Intent intent)
/**
* 更新卡片时的回调。
* 这里的formId就是onCreateForm中的AbilitySlice.PARAM_FORM_IDENTITY_KEY参数。
*/
protected void onUpdateForm(long formId)
/**
* 删除卡片时的回调。
* 这里的formId就是onCreateForm中的AbilitySlice.PARAM_FORM_IDENTITY_KEY参数。
*/
protected void onDeleteForm(long formId)
在这种情况下,一般都是内容提供方通过远程View的方式将内容渲染到内容显示方的,鸿蒙系统上这个跨进程的数据传输行为是由ComponentProvider来实现的。
// 第一种: 在onCreateForm()时,先创建一个卡片对应的ProviderFormInfo实例。
// 再通过ProviderFormInfo的实例拿到向它传输数据的ComponentProvider。
ProviderFormInfo form = new ProviderFormInfo(layoutId, context);
ComponentProvider cp = form.getComponentProvider();
// 第二种: 在onUpdateForm()时,直接创建出一个ComponentProvider。
ComponentProvider cp = new ComponentProvider(layoutId, context);
1需要注意的问题 1
2需要注意的问题 2
3需要注意的问题 3
当用户未安装优酷主客时,显示一个中转页,提供下载按钮供用户跳转到华为应用市场去下载优酷主客,当用户安装完优酷主客回来时,下载按钮变成选集列表,对单集视频则变成播放按钮;
当用户已安装优酷主客时,中转页自动打开优酷主客的播放页,并退出。
一是针对每个数据请求接口,封装一个新的HTTP Open API接口,客户端可以通过HTTP(S)直接访问;
二是客户端通过H5页面里的JS版Network库发起数据请求。
public class LoadAgent extends WebAgent {
// ...
@Override
public ResourceResponse processResourceRequest(WebView webView, ResourceRequest request) {
// mInterceptor用于识别HTML和JS网络库的URL,并返回本地资源中的HTML和JS。
ResourceResponse response = mInterceptor.intercept(request);
if (response != null) {
return response;
}
return super.processResourceRequest(webView, request);
}
}
// StoreConfig最常见的作用是配置数据库名字。也可以配置存储模式、加密等高级需求。
StoreConfig config = StoreConfig.newDefaultConfig(DB_NAME_FORM_STORE);
// RdbOpenCallback用于定义创建数据库、升级数据库结构版本等时机的回调。
RdbOpenCallback callback = new FormStoreOpenCallback(context);
DatabaseHelper helper = new DatabaseHelper(context);
// RdbStore是数据库的封装类,最终的增删改查操作都通过它来进行。
RdbStore store = helper.getRdbStore(config, CURRENT_VERSION, callback);
在updateEnabled设为true的情况下,updateDuration才有意义。updateDuration用于指定更新的时间间隔。鸿蒙系统还支持固定时间更新,通过指定scheduledUpateTime来设置更新时间。updateDuration和scheduledUpateTime只能选择其中一种方式。
性能
由于数据请求和埋点用到了JS库,并且在WebView中运行,这使得运行时效率比Java要低,还要处理WebView与外界的交互,对性能有较大影响。虽然已经有了一些措施来减少这方面的影响,但是后续还是需要继续挖掘潜力监控
后续还需要补足JS侧崩溃等信息收集的能力。线上配置能力
优酷主客可以通过各种远程配置平台下发各种配置信息。而鸿蒙上由于体积限制无法自带相关的库。今后需要考虑使用其他方式实现远程配置能力。